
package datos;
import java.util.Scanner;

/**
 * @author JLS
 * @param <T>
 */
public class PedirDato<T> {
    private static Scanner teclado;
       
    public static <dato> dato pedirDato(String message, Class<dato> tipo) {//throws Exception{
    System.out.println(message);
    boolean continuar = true;
    do{
        teclado = new Scanner(System.in);
        try {
            if(tipo.getClass().isInstance(Integer.class)){
                Integer num = (Integer.valueOf(teclado.nextInt()));
                continuar = false;
                return ((dato)num);
            }
            if(tipo.getClass().isInstance(String.class)){
                String cad = (teclado.nextLine());
                continuar = false;
                return ((dato)cad);
            }
            if(tipo.getClass().isInstance(Double.class))
            {
                Double num = (Double.valueOf(teclado.nextDouble()));
                continuar = false;
                return ((dato)num);
            }
            if(tipo.getClass().isInstance(Float.class)){
                Float num = (Float.valueOf(teclado.nextFloat()));
                continuar = false;
                return ((dato)num);
            }
        } catch (Exception e) {
            System.out.println("El valor introducido no es de tipo: " + tipo.getName());
        }
    }while (continuar);
    return null;
}
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    /*public static byte pedirByte(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        byte numByte = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero byte: ");
            try {
                numByte = teclado.nextByte();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo byte");
                teclado.next();
            }
        }
        return numByte;
    }
    
    public static byte pedirByte(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        byte numByte = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numByte = teclado.nextByte();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo entero");
                teclado.next();
            }
        }
        return numByte;
    }
    
    public static short pedirShort(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        short numShort = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero: ");
            try {
                numShort = teclado.nextShort();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo short");
                teclado.next();
            }
        }
        return numShort;
    }
    
    public static short pedirShort(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        short numShort = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numShort = teclado.nextShort();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo short");
                teclado.next();
            }
        }
        return numShort;
    }
    
    public static int pedirInt(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        int numInt = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero: ");
            try {
                numInt = teclado.nextInt();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Int");
                teclado.next();
            }
        }
        return numInt;
    }
    
    public static int pedirInt(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        int numInt = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numInt = teclado.nextInt();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Int");
                teclado.next();
            }
        }
        return numInt;
    }
    
    public static long pedirLong(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        long numLng = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero: ");
            try {
                numLng = teclado.nextLong();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Long");
                teclado.next();
            }
        }
        return numLng;
    }
    
    public static long pedirLong(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        long numLng = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numLng = teclado.nextLong();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Long");
                teclado.next();
            }
        }
        return numLng;
    }
    
    public static float pedirFloat(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        float numFloat = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero: ");
            try {
                numFloat = teclado.nextFloat();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Float");
                teclado.next();
            }
        }
        return numFloat;
    }
    
    public static float pedirFloat(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        float numFloat = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numFloat = teclado.nextFloat();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo Float");
                teclado.next();
            }
        }
        return numFloat;
    }
    
    public static double pedirDouble(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        double numDbl = 0;
        while (continuar == false) {
            System.out.println("Teclea un numero double: ");
            try {
                numDbl = teclado.nextDouble();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo double");
                teclado.next();
            }
        }
        return numDbl;
    }
    
    public static double pedirDouble(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        double numDbl = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                numDbl = teclado.nextDouble();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo double");
                teclado.next();
            }
        }
        return numDbl;
    }
    
    public static char pedirChar(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        char caracter = 0;
        while (continuar == false) {
            System.out.println("Introduzca Caracter: ");
            try {
                caracter = teclado.next().charAt(0);
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo char");
                teclado.next();
            }
        }
        return caracter;
    }
    
    public static char pedirChar(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        char caracter = 0;
        while (continuar == false) {
            System.out.println(msg);
            try {
                caracter = teclado.next().charAt(0);
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo char");
                teclado.next();
            }
        }
        return caracter;
    }
    
    public static String pedirString(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        String cadena = "";
        while (continuar == false) {
            System.out.println("Introduzca texto: ");
            try {
                cadena = teclado.next();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo String");
                teclado.next();
            }
        }
        return cadena;
    }
    
    public static String pedirString(String msg){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        String cadena = "";
        while (continuar == false) {
            System.out.println(msg);
            try {
                cadena = teclado.next();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo String");
                teclado.next();
            }
        }
        return cadena;
    }
    
    public static boolean pedirBoolean(){
        teclado = new Scanner(System.in);
        boolean continuar = false;
        boolean opcion = false;
        while (continuar == false) {
            System.out.println("Introduzca opción (true/false): ");
            try {
                opcion = teclado.nextBoolean();
                teclado.nextLine();
                continuar = true;
            } catch (Exception e) {
                System.out.println("El valor introducido no es de tipo booleano");
                teclado.next();
            }
        }
        return opcion;
    }
    
    public static boolean opcionContinuar(){
        boolean opcion = false;
        String opc = "";
        do {
            System.out.println ("¿Desea Continuar? (S/N)");
            opc = teclado.nextLine();
        } while (!opc.equals("s") && !opc.equals("S") && !opc.equals("n") && !opc.equals("N")); 
        
        if((opc.equals("s")) || (opc.equals("S"))){
            opcion = true;
        }
        return opcion;
    }*/

   
}
